package com.cjq.jwt;

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * JWT自动配置类，用于创建JWT相关Bean
 * 通过@EnableConfigurationProperties启用JwtProperties配置属性
 */
@Configuration
@EnableConfigurationProperties(JwtProperties.class)
public class JwtAutoConfiguration {

    /**
     * 创建JwtProperties校验Bean
     *
     * @param properties 注入的JWT配置属性对象
     * @return 返回校验标记实例
     *
     * 重要说明：通过调用validate()方法在容器启动时
     * 主动触发配置属性校验逻辑，确保配置有效性
     */
    @Bean
    public JwtPropertiesValidator jwtPropertiesValidator(JwtProperties properties) {
        properties.validate(); // 启动时校验配置
        return new JwtPropertiesValidator();
    }

    /**
     * 创建JWT工具类Bean
     *
     * @param properties 注入的JWT配置属性对象
     * @return 返回初始化后的JwtUtil实例
     *
     * 条件约束：必须存在JwtPropertiesValidator Bean后才创建
     * 保证配置校验通过后才初始化JWT工具类
     */
    @Bean
    @ConditionalOnBean(JwtPropertiesValidator.class) // 确保先校验
    public JwtUtil jwtUtil(JwtProperties properties) {
        return new JwtUtil(properties);
    }

    /**
     * JWT配置校验标记类
     * 作为Bean存在表示JwtProperties已通过有效性校验
     * 用于控制JwtUtil的条件化创建顺序
     */
    private static class JwtPropertiesValidator {} // 校验标记
}
